home *** CD-ROM | disk | FTP | other *** search
- #include <ImageCodec.h>
-
- #include "DropKeyFrames.h"
-
- // data structures
-
- typedef struct {
- Component victim;
- } DropKeyFramesSharedGlobalsRecord, **DropKeyFramesSharedGlobalsHandle;
-
- typedef struct{
- ComponentInstance self;
- ComponentInstance delegateComponent;
- ComponentInstance target;
- DropKeyFramesSharedGlobalsHandle sharedGlobals;
- UInt32 beginCount;
- UInt32 drawCount;
- UInt32 endCount;
- } DropKeyFramesGlobalsRecord, *DropKeyFramesGlobalsPtr;
-
- // dispatcher
-
- #define IMAGECODEC_BASENAME() DropKeyFrames
- #define IMAGECODEC_GLOBALS() DropKeyFramesGlobalsPtr storage
-
- #define CALLCOMPONENT_BASENAME() IMAGECODEC_BASENAME()
- #define CALLCOMPONENT_GLOBALS() IMAGECODEC_GLOBALS()
-
- #define COMPONENT_UPP_PREFIX() uppImageCodec
- #define COMPONENT_DISPATCH_FILE "DropKeyFramesDispatch.h"
- #define COMPONENT_SELECT_PREFIX() kImageCodec
-
- #define GET_DELEGATE_COMPONENT() (storage->delegateComponent)
-
- #include "Components.k.h"
- #include "ImageCodec.k.h"
- #include "ComponentDispatchHelper.c"
-
- // code
-
- pascal ComponentResult DropKeyFramesOpen(DropKeyFramesGlobalsPtr glob, ComponentInstance self)
- {
- ComponentResult err;
- DropKeyFramesSharedGlobalsHandle sharedGlobals;
-
- glob = (DropKeyFramesGlobalsPtr)NewPtrClear(sizeof(DropKeyFramesGlobalsRecord));
- err = MemError();
- if (noErr != err) goto bail;
-
- SetComponentInstanceStorage(self, (Handle)glob);
- glob->self = self;
- glob->target = self;
-
- sharedGlobals = (DropKeyFramesSharedGlobalsHandle)GetComponentRefcon((Component)self);
- if (!sharedGlobals) {
- Component victim;
- ComponentDescription cd;
-
- GetComponentInfo((Component)self, &cd, nil, nil, nil);
- cd.componentManufacturer = kVictimManufacturer;
- cd.componentFlags = 0;
- cd.componentFlagsMask = 0;
- victim = FindNextComponent(nil, &cd);
- if (!victim) {
- DebugStr("\p couldn't find victim!");
- err = paramErr;
- goto bail;
- }
-
- sharedGlobals = (DropKeyFramesSharedGlobalsHandle) NewHandleSysClear(sizeof(DropKeyFramesSharedGlobalsRecord));
- if (!sharedGlobals) {
- err = MemError();
- goto bail;
- }
- SetComponentRefcon((Component)self, (long)sharedGlobals);
-
- victim = CaptureComponent(victim, (Component)self);
- if (!victim) {
- err = paramErr;
- goto bail;
- }
- (**sharedGlobals).victim = victim;
- }
-
- glob->sharedGlobals = sharedGlobals;
- err = OpenAComponent((**sharedGlobals).victim, &glob->delegateComponent);
- if (err) goto bail;
-
- ComponentSetTarget(glob->delegateComponent, self);
-
- bail:
- return err;
- }
-
- pascal ComponentResult DropKeyFramesRegister(DropKeyFramesGlobalsPtr glob)
- {
- // If we get this far, we must have been opened successfully, so all is well.
- return noErr;
- }
-
- pascal ComponentResult DropKeyFramesUnregister(DropKeyFramesGlobalsPtr glob)
- {
- UncaptureComponent((**glob->sharedGlobals).victim);
- DisposeHandle((Handle)glob->sharedGlobals);
- return noErr;
- }
-
- pascal ComponentResult DropKeyFramesClose(DropKeyFramesGlobalsPtr glob, ComponentInstance self)
- {
- if (glob) {
- if (glob->delegateComponent)
- CloseComponent(glob->delegateComponent);
-
- DisposePtr((Ptr)glob);
- }
-
- return noErr;
- }
-
- pascal ComponentResult DropKeyFramesTarget(DropKeyFramesGlobalsPtr glob, ComponentInstance target)
- {
- glob->target = target;
- if (glob->delegateComponent)
- ComponentSetTarget(glob->delegateComponent, target);
-
- return noErr;
- }
-
- pascal ComponentResult DropKeyFramesVersion(DropKeyFramesGlobalsPtr glob)
- {
- return CallComponentVersion(glob->delegateComponent);
- }
-
- static Boolean capsLockIsDown(void)
- {
- KeyMapByteArray keys;
- GetKeys((UInt32*)keys);
- return (keys[7] & 2) ? true : false;
- }
-
- // Based on empirical observations, this appears to be true for Sorenson frames.
- #define isKeyFrame(drp) (((*(UInt32*)drp->codecData) & 1) == 0)
-
- pascal ComponentResult DropKeyFramesBeginBand(DropKeyFramesGlobalsPtr glob, CodecDecompressParams *p, ImageSubCodecDecompressRecord *drp, long flags)
- {
- Boolean okayToDrop = (0 != glob->beginCount++); // don't drop first frame
-
- if(okayToDrop && isKeyFrame(drp))
- return noErr;
- else
- return ImageCodecBeginBand(glob->delegateComponent, p, drp, flags);
- }
-
- pascal ComponentResult DropKeyFramesDrawBand(DropKeyFramesGlobalsPtr glob, ImageSubCodecDecompressRecord *drp)
- {
- Boolean okayToDrop = (0 != glob->drawCount++);
-
- if(okayToDrop && isKeyFrame(drp))
- return noErr;
- else
- return ImageCodecDrawBand(glob->delegateComponent, drp);
- }
-
- pascal ComponentResult DropKeyFramesEndBand(DropKeyFramesGlobalsPtr glob, ImageSubCodecDecompressRecord *drp, OSErr result, long flags)
- {
- Boolean okayToDrop = (0 != glob->endCount++);
-
- if(okayToDrop && isKeyFrame(drp))
- return noErr;
- else
- return ImageCodecEndBand(glob->delegateComponent, drp, result, flags);
- }
-
-